Have you stepped through this function on paper using drawings representing an example list? What have you found out about the behavior of this function after doing so?
Consider the following example list: (I'm using NODE[...] to denote a node struct, and arrows to show where pointers lead.)
example--> NODE[str="Hello",next]-->NODE[str="open",next]-->NODE[str="leave",next]-->NODE[str="never",next]-->NODE[str="radio",next]-->NODE[str="table",next]-->null
Draw all the parts of this list out on paper and step through the code. First, you pass the list into the function, where it gets represented by the pointer x. Draw x pointing to the front of the list. Draw pointers for the local variables 'temp' and 'y'.
example--> NODE[str="Hello",next]-->NODE[str="open",next]-->NODE[str="leave",next]-->NODE[str="never",next]-->NODE[str="radio",next]-->NODE[str="table",next]-->null
^
x-----|
y
temp
The next step is to point y to x. Draw your arrow to the same location that x points to:
example--> NODE[str="Hello",next]-->NODE[str="open",next]-->NODE[str="leave",next]-->NODE[str="never",next]-->NODE[str="radio",next]-->NODE[str="table",next]-->null
^^
x-----||
y------|
temp
And you continue to follow the directions until you can work out what it is the function is trying to do. The next step is the 'while' loop. While y is not null, and the character in x's "str" at position strlen(x->str)-1 is not equal to the character in y's "str" at position 0, continue to loop.
I could go on but it would be beneficial for you to experience the exercise of working through the algorithm yourself. Try it, and see what you can learn.